#include "iwdg_func.h"

void IWDG_Init(void)
{
  // IWDG 由 LSI 时钟驱动，无需开启外部时钟
  // 但需要先取消写保护，才能配置寄存器
#if ENABLE_WDG
  /* 启动 IWDG */
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 允许写 IWDG 寄存器

  /* 设置预分频系数 */
  // IWDG_Prescaler_4   -> 分频 4   -> 计数频率 = LSI/4   ≈ 8kHz
  // IWDG_Presclaimer_8  -> 分频 8   ≈ 4kHz
  // ...
  // IWDG_Prescaler_256 -> 分频 256 ≈ 125Hz (推荐)
  IWDG_SetPrescaler(IWDG_Prescaler_256);

  /* 设置重装载值（Reload Value） */
  // 计数器从 Reload 值递减到 0 触发复位
  // LSI ≈ 32kHz, 经过 256 分频 → 每 tick 时间 = 256 / 32000 ≈ 8ms
  // 设置 Reload = 500 → 超时时间 ≈ 500 * 8ms = 4000ms = 4秒
  IWDG_SetReload(500);

  /* 手动加载一次计数器初值 */
  IWDG_ReloadCounter();

  /* 启动 IWDG（一旦启动，无法关闭，除非复位） */
  IWDG_Enable();

  /* 可选：等待寄存器同步（因为 IWDG 运行在低速时钟域） */
  while (IWDG_GetFlagStatus(IWDG_FLAG_PVU) || IWDG_GetFlagStatus(IWDG_FLAG_RVU))
  {
    // 等待预分频和重载值更新完成
  }
#endif
}
void IWDG_Feed(void)
{
#if ENABLE_WDG
  IWDG_ReloadCounter(); // 重新加载计数器值，即“喂狗”
#endif
}
